install.packages(‘flexboard’)

title: ‘Computational Musicology’ author: ‘John Ashley Burgoyne’ date: ‘February–March 2020’ output: flexdashboard::flex_dashboard: storyboard: true theme: flatly —

# In order to use these packages, we need to install flexdashboard, plotly, and Cairo.
library(tidyverse)
library(plotly)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Attaching package: 㤼㸱plotly㤼㸲

The following object is masked from 㤼㸱package:ggplot2㤼㸲:

    last_plot

The following object is masked from 㤼㸱package:stats㤼㸲:

    filter

The following object is masked from 㤼㸱package:graphics㤼㸲:

    layout
library(spotifyr)
source('spotify.R')

Introduction

This is introductory text. In general, it is not possible to use headers in this text.


This is a second column of introductory text.

The Grammys are angrier than the Edisons

grammy <- get_playlist_audio_features('digster.fm', '4kQovkgBZTd8h2HCM3fF31')
edison <- get_playlist_audio_features('spotify', '37i9dQZF1DX8mnKbIkppDf')
awards <-
    grammy %>% mutate(playlist = "Grammys") %>%
    bind_rows(edison %>% mutate(playlist = "Edisons"))
angry <-
    awards %>%                   # Start with awards.
    mutate(                      # Make pretty labels for mode.
        mode =                  
            factor(
                mode, 
                c(1, 0), 
                c("Major", "Minor")
            )
    ) %>% 
    ggplot(                      # Set up the plot.
        aes(
            x = valence,
            y = energy,
            size = loudness,
            colour = mode,
            label = track.name   # Labels will be interactively visible.
        )
    ) +
    geom_point() +               # Scatter plot.
    geom_rug(size = 0.1) +       # Add 'fringes' to show data distribution.
    facet_wrap(~ playlist) +     # Separate charts per playlist.
    scale_x_continuous(          # Fine-tune the x axis.
        limits = c(0, 1),
        breaks = c(0, 0.50, 1),  # Use grid-lines for quadrants only.
        minor_breaks = NULL      # Remove 'minor' grid-lines.
    ) +
    scale_y_continuous(          # Fine-tune the y axis in the same way.
        limits = c(0, 1),
        breaks = c(0, 0.50, 1),
        minor_breaks = NULL
    ) +
    scale_colour_brewer(         # Use the Color Brewer to choose a palette.
        type = "qual",           # Qualitative set.
        palette = "Paired"       # Name of the palette is 'Paired'.
    ) +
    scale_size_continuous(       # Fine-tune the sizes of each point.
        trans = "exp",           # Use an exp transformation to emphasise loud.
        guide = "none"           # Remove the legend for size.
    ) +
    theme_light() +              # Use a simpler them.
    labs(                        # Make the titles nice.
        x = "Valence",
        y = "Energy",
        colour = "Mode"
    )
ggplotly(angry)

For this visualisation from Week 7, I took playlists of the pop music presented at the Grammy awards (US) and the Edison awards (NL) in 2019. Using ggplotly, the visualisation became interactive.

The x axis shows valence and the y axis shows Spotify’s ‘energy’ feature, which is roughly analogous to the notion of arousal in psychological research on emotion. Under this model, the quadrants of each graph, starting clockwise from the top left, represent angry, happy, relaxed, and sad music. The size of each point is proportional to the average volume of the track.

aW5zdGFsbC5wYWNrYWdlcygnZmxleGJvYXJkJykNCi0tLQ0KdGl0bGU6ICAnQ29tcHV0YXRpb25hbCBNdXNpY29sb2d5Jw0KYXV0aG9yOiAnSm9obiBBc2hsZXkgQnVyZ295bmUnDQpkYXRlOiAgICdGZWJydWFyeS0tTWFyY2ggMjAyMCcNCm91dHB1dDogDQogICAgZmxleGRhc2hib2FyZDo6ZmxleF9kYXNoYm9hcmQ6DQogICAgICAgIHN0b3J5Ym9hcmQ6IHRydWUNCiAgICAgICAgdGhlbWU6IGZsYXRseQ0KLS0tDQoNCmBgYHtyIHNldHVwfQ0KIyBJbiBvcmRlciB0byB1c2UgdGhlc2UgcGFja2FnZXMsIHdlIG5lZWQgdG8gaW5zdGFsbCBmbGV4ZGFzaGJvYXJkLCBwbG90bHksIGFuZCBDYWlyby4NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KHNwb3RpZnlyKQ0Kc291cmNlKCdzcG90aWZ5LlInKQ0KYGBgDQoNCiMjIyBJbnRyb2R1Y3Rpb24NCg0KVGhpcyBpcyBpbnRyb2R1Y3RvcnkgdGV4dC4gSW4gZ2VuZXJhbCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHVzZSBoZWFkZXJzIGluIHRoaXMgdGV4dC4NCg0KKioqDQoNClRoaXMgaXMgYSBzZWNvbmQgY29sdW1uIG9mIGludHJvZHVjdG9yeSB0ZXh0Lg0KDQoNCiMjIyBUaGUgR3JhbW15cyBhcmUgYW5ncmllciB0aGFuIHRoZSBFZGlzb25zDQoNCmBgYHtyfQ0KZ3JhbW15IDwtIGdldF9wbGF5bGlzdF9hdWRpb19mZWF0dXJlcygnZGlnc3Rlci5mbScsICc0a1FvdmtnQlpUZDhoMkhDTTNmRjMxJykNCmVkaXNvbiA8LSBnZXRfcGxheWxpc3RfYXVkaW9fZmVhdHVyZXMoJ3Nwb3RpZnknLCAnMzdpOWRRWkYxRFg4bW5LYklrcHBEZicpDQphd2FyZHMgPC0NCiAgICBncmFtbXkgJT4lIG11dGF0ZShwbGF5bGlzdCA9ICJHcmFtbXlzIikgJT4lDQogICAgYmluZF9yb3dzKGVkaXNvbiAlPiUgbXV0YXRlKHBsYXlsaXN0ID0gIkVkaXNvbnMiKSkNCmFuZ3J5IDwtDQogICAgYXdhcmRzICU+JSAgICAgICAgICAgICAgICAgICAjIFN0YXJ0IHdpdGggYXdhcmRzLg0KICAgIG11dGF0ZSggICAgICAgICAgICAgICAgICAgICAgIyBNYWtlIHByZXR0eSBsYWJlbHMgZm9yIG1vZGUuDQogICAgICAgIG1vZGUgPSAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgZmFjdG9yKA0KICAgICAgICAgICAgICAgIG1vZGUsIA0KICAgICAgICAgICAgICAgIGMoMSwgMCksIA0KICAgICAgICAgICAgICAgIGMoIk1ham9yIiwgIk1pbm9yIikNCiAgICAgICAgICAgICkNCiAgICApICU+JSANCiAgICBnZ3Bsb3QoICAgICAgICAgICAgICAgICAgICAgICMgU2V0IHVwIHRoZSBwbG90Lg0KICAgICAgICBhZXMoDQogICAgICAgICAgICB4ID0gdmFsZW5jZSwNCiAgICAgICAgICAgIHkgPSBlbmVyZ3ksDQogICAgICAgICAgICBzaXplID0gbG91ZG5lc3MsDQogICAgICAgICAgICBjb2xvdXIgPSBtb2RlLA0KICAgICAgICAgICAgbGFiZWwgPSB0cmFjay5uYW1lICAgIyBMYWJlbHMgd2lsbCBiZSBpbnRlcmFjdGl2ZWx5IHZpc2libGUuDQogICAgICAgICkNCiAgICApICsNCiAgICBnZW9tX3BvaW50KCkgKyAgICAgICAgICAgICAgICMgU2NhdHRlciBwbG90Lg0KICAgIGdlb21fcnVnKHNpemUgPSAwLjEpICsgICAgICAgIyBBZGQgJ2ZyaW5nZXMnIHRvIHNob3cgZGF0YSBkaXN0cmlidXRpb24uDQogICAgZmFjZXRfd3JhcCh+IHBsYXlsaXN0KSArICAgICAjIFNlcGFyYXRlIGNoYXJ0cyBwZXIgcGxheWxpc3QuDQogICAgc2NhbGVfeF9jb250aW51b3VzKCAgICAgICAgICAjIEZpbmUtdHVuZSB0aGUgeCBheGlzLg0KICAgICAgICBsaW1pdHMgPSBjKDAsIDEpLA0KICAgICAgICBicmVha3MgPSBjKDAsIDAuNTAsIDEpLCAgIyBVc2UgZ3JpZC1saW5lcyBmb3IgcXVhZHJhbnRzIG9ubHkuDQogICAgICAgIG1pbm9yX2JyZWFrcyA9IE5VTEwgICAgICAjIFJlbW92ZSAnbWlub3InIGdyaWQtbGluZXMuDQogICAgKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKCAgICAgICAgICAjIEZpbmUtdHVuZSB0aGUgeSBheGlzIGluIHRoZSBzYW1lIHdheS4NCiAgICAgICAgbGltaXRzID0gYygwLCAxKSwNCiAgICAgICAgYnJlYWtzID0gYygwLCAwLjUwLCAxKSwNCiAgICAgICAgbWlub3JfYnJlYWtzID0gTlVMTA0KICAgICkgKw0KICAgIHNjYWxlX2NvbG91cl9icmV3ZXIoICAgICAgICAgIyBVc2UgdGhlIENvbG9yIEJyZXdlciB0byBjaG9vc2UgYSBwYWxldHRlLg0KICAgICAgICB0eXBlID0gInF1YWwiLCAgICAgICAgICAgIyBRdWFsaXRhdGl2ZSBzZXQuDQogICAgICAgIHBhbGV0dGUgPSAiUGFpcmVkIiAgICAgICAjIE5hbWUgb2YgdGhlIHBhbGV0dGUgaXMgJ1BhaXJlZCcuDQogICAgKSArDQogICAgc2NhbGVfc2l6ZV9jb250aW51b3VzKCAgICAgICAjIEZpbmUtdHVuZSB0aGUgc2l6ZXMgb2YgZWFjaCBwb2ludC4NCiAgICAgICAgdHJhbnMgPSAiZXhwIiwgICAgICAgICAgICMgVXNlIGFuIGV4cCB0cmFuc2Zvcm1hdGlvbiB0byBlbXBoYXNpc2UgbG91ZC4NCiAgICAgICAgZ3VpZGUgPSAibm9uZSIgICAgICAgICAgICMgUmVtb3ZlIHRoZSBsZWdlbmQgZm9yIHNpemUuDQogICAgKSArDQogICAgdGhlbWVfbGlnaHQoKSArICAgICAgICAgICAgICAjIFVzZSBhIHNpbXBsZXIgdGhlbS4NCiAgICBsYWJzKCAgICAgICAgICAgICAgICAgICAgICAgICMgTWFrZSB0aGUgdGl0bGVzIG5pY2UuDQogICAgICAgIHggPSAiVmFsZW5jZSIsDQogICAgICAgIHkgPSAiRW5lcmd5IiwNCiAgICAgICAgY29sb3VyID0gIk1vZGUiDQogICAgKQ0KZ2dwbG90bHkoYW5ncnkpDQpgYGANCg0KKioqDQoNCkZvciB0aGlzIHZpc3VhbGlzYXRpb24gZnJvbSBXZWVrIDcsIEkgdG9vayBwbGF5bGlzdHMgb2YgdGhlIHBvcCBtdXNpYyBwcmVzZW50ZWQgYXQgdGhlIEdyYW1teSBhd2FyZHMgKFVTKSBhbmQgdGhlIEVkaXNvbiBhd2FyZHMgKE5MKSBpbiAyMDE5LiBVc2luZyBgZ2dwbG90bHlgLCB0aGUgdmlzdWFsaXNhdGlvbiBiZWNhbWUgaW50ZXJhY3RpdmUuDQoNClRoZSAqeCogYXhpcyBzaG93cyB2YWxlbmNlIGFuZCB0aGUgKnkqIGF4aXMgc2hvd3MgU3BvdGlmeSdzIOKAmGVuZXJneeKAmSBmZWF0dXJlLCB3aGljaCBpcyByb3VnaGx5IGFuYWxvZ291cyB0byB0aGUgbm90aW9uIG9mIGFyb3VzYWwgaW4gcHN5Y2hvbG9naWNhbCByZXNlYXJjaCBvbiBlbW90aW9uLiBVbmRlciB0aGlzIG1vZGVsLCB0aGUgcXVhZHJhbnRzIG9mIGVhY2ggZ3JhcGgsIHN0YXJ0aW5nIGNsb2Nrd2lzZSBmcm9tIHRoZSB0b3AgbGVmdCwgcmVwcmVzZW50IGFuZ3J5LCBoYXBweSwgcmVsYXhlZCwgYW5kIHNhZCBtdXNpYy4gVGhlIHNpemUgb2YgZWFjaCBwb2ludCBpcyBwcm9wb3J0aW9uYWwgdG8gdGhlIGF2ZXJhZ2Ugdm9sdW1lIG9mIHRoZSB0cmFjay4NCg==